package com.zsyc.controller;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBar.ButtonData;
import java.io.IOException;
import java.util.logging.Logger;
import java.util.logging.Level;
import com.zsyc.util.DatabaseManager;

/**
 * 主控制器类
 */
public class MainController {
    private static final Logger LOGGER = Logger.getLogger(MainController.class.getName());
    
    @FXML private StackPane contentArea;
    @FXML private Label statusLabel;
    @FXML private Label dbStatusLabel;
    
    private Stage primaryStage;
    
    /**
     * 初始化控制器
     */
    @FXML
    public void initialize() {
        // 初始化数据库
        try {
            DatabaseManager.initializeDatabase();
            dbStatusLabel.setText("数据库连接正常");
            statusLabel.setText("就绪");
        } catch (Exception e) {
            LOGGER.log(Level.SEVERE, "数据库初始化失败", e);
            dbStatusLabel.setText("数据库连接失败");
            statusLabel.setText("错误");
            
            // 尝试重新创建数据库表
            try {
                DatabaseManager.recreateTables();
                dbStatusLabel.setText("数据库连接正常");
                statusLabel.setText("就绪");
            } catch (Exception ex) {
                LOGGER.log(Level.SEVERE, "重新创建数据库表失败", ex);
                showError("数据库错误", "无法连接到数据库，请检查配置。\n错误信息: " + ex.getMessage());
            }
        }
    }
    
    /**
     * 设置主舞台引用
     */
    public void setPrimaryStage(Stage primaryStage) {
        this.primaryStage = primaryStage;
    }
    
    /**
     * 显示英语学习模块
     */
    @FXML
    private void showEnglishLearning() {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/EnglishLearningView.fxml"));
            Parent root = loader.load();
            contentArea.getChildren().setAll(root);
            statusLabel.setText("英语学习模块");
            
            // 设置控制器引用
            EnglishLearningController controller = loader.getController();
            if (controller != null) {
                controller.setMainController(this);
            }
            
        } catch (IOException e) {
            LOGGER.log(Level.SEVERE, "加载英语学习模块失败", e);
            showError("加载失败", "无法加载英语学习模块。");
        }
    }
    
    /**
     * 显示代码学习模块
     */
    @FXML
    private void showCodeLearning() {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/CodeLearningView.fxml"));
            Parent root = loader.load();
            contentArea.getChildren().setAll(root);
            statusLabel.setText("代码学习模块");
            
            // 设置控制器引用
            CodeLearningController controller = loader.getController();
            if (controller != null) {
                controller.setMainController(this);
            }
            
        } catch (IOException e) {
            LOGGER.log(Level.SEVERE, "加载代码学习模块失败", e);
            showError("加载失败", "无法加载代码学习模块。");
        }
    }
    
    /**
     * 显示任务管理模块
     */
    @FXML
    private void showTaskManagement() {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/TaskManagementView.fxml"));
            Parent root = loader.load();
            contentArea.getChildren().setAll(root);
            statusLabel.setText("任务管理模块");
            
            // 设置控制器引用
            TaskManagementController controller = loader.getController();
            if (controller != null) {
                controller.setMainController(this);
            }
            
        } catch (IOException e) {
            LOGGER.log(Level.SEVERE, "加载任务管理模块失败", e);
            showError("加载失败", "无法加载任务管理模块。");
        }
    }
    
    /**
     * 显示设置模块
     */
    @FXML
    private void showSettings() {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/SettingsView.fxml"));
            Parent root = loader.load();
            contentArea.getChildren().setAll(root);
            statusLabel.setText("设置模块");
            
            // 设置控制器引用
            SettingsController settingsController = loader.getController();
            settingsController.setPrimaryStage(primaryStage);
            settingsController.setMainController(this);
            
        } catch (IOException e) {
            LOGGER.log(Level.SEVERE, "加载设置模块失败", e);
            showError("加载失败", "无法加载设置模块。");
        }
    }
    
    /**
     * 显示关于对话框
     */
    @FXML
    private void showAbout() {
        Alert alert = new Alert(AlertType.INFORMATION);
        alert.setTitle("关于");
        alert.setHeaderText("多功能学习辅助工具");
        alert.setContentText(
            "版本: 1.0.0\n" +
            "开发语言: Java 23\n" +
            "GUI框架: JavaFX\n" +
            "数据库: SQLite\n\n" +
            "功能模块:\n" +
            "• 英语学习 - 单词连连看游戏\n" +
            "• 代码学习 - 错题诊断练习\n" +
            "• 任务管理 - 日常任务规划\n\n" +
            "© 2025 ZSYC Learning Assistant"
        );
        alert.showAndWait();
    }
    
    /**
     * 显示错误对话框
     */
    private void showError(String title, String content) {
        Alert alert = new Alert(AlertType.ERROR);
        alert.setTitle("错误");
        alert.setHeaderText(title);
        alert.setContentText(content);
        alert.showAndWait();
    }
    
    /**
     * 更新状态栏
     */
    public void updateStatus(String status) {
        statusLabel.setText(status);
    }
    
    /**
     * 获取主舞台
     */
    public Stage getPrimaryStage() {
        return primaryStage;
    }
    
    /**
     * 获取内容区域
     */
    public javafx.scene.layout.StackPane getContentArea() {
        return contentArea;
    }
    
    /**
     * 显示主界面
     */
    public void showMainView() {
        try {
            // 重新加载主界面FXML，显示欢迎页面
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/MainView.fxml"));
            Parent root = loader.load();
            
            // 获取主窗口的根节点并替换内容
            if (primaryStage != null && primaryStage.getScene() != null) {
                primaryStage.getScene().setRoot(root);
            } else {
                // 如果无法获取主窗口，则清空内容区域并显示欢迎页面
                contentArea.getChildren().clear();
                showWelcomePage();
            }
            statusLabel.setText("就绪");
        } catch (IOException e) {
            LOGGER.log(Level.SEVERE, "加载主界面失败", e);
            // 如果加载失败，显示简单的欢迎页面
            contentArea.getChildren().clear();
            showWelcomePage();
            statusLabel.setText("就绪");
        }
    }
    
    /**
     * 显示欢迎页面
     */
    private void showWelcomePage() {
        VBox welcomePanel = new VBox();
        welcomePanel.getStyleClass().add("welcome-panel");
        welcomePanel.setAlignment(javafx.geometry.Pos.CENTER);
        welcomePanel.setSpacing(20);
        
        Label welcomeTitle = new Label("欢迎使用多功能学习辅助工具");
        welcomeTitle.getStyleClass().add("welcome-title");
        
        Label welcomeSubtitle = new Label("请选择左侧功能模块开始学习");
        welcomeSubtitle.getStyleClass().add("welcome-subtitle");
        
        HBox featureCards = new HBox(30);
        featureCards.setAlignment(javafx.geometry.Pos.CENTER);
        
        // 创建功能卡片
        VBox englishCard = createFeatureCard("📚", "英语学习", "单词连连看游戏");
        VBox codeCard = createFeatureCard("💻", "代码学习", "错题诊断练习");
        VBox taskCard = createFeatureCard("✅", "任务管理", "日常任务规划");
        
        featureCards.getChildren().addAll(englishCard, codeCard, taskCard);
        welcomePanel.getChildren().addAll(welcomeTitle, welcomeSubtitle, featureCards);
        
        contentArea.getChildren().add(welcomePanel);
    }
    
    /**
     * 创建功能卡片
     */
    private VBox createFeatureCard(String icon, String title, String description) {
        VBox card = new VBox(10);
        card.getStyleClass().add("feature-card");
        card.setAlignment(javafx.geometry.Pos.CENTER);
        
        Label iconLabel = new Label(icon);
        iconLabel.getStyleClass().add("feature-icon");
        
        Label titleLabel = new Label(title);
        titleLabel.getStyleClass().add("feature-title");
        
        Label descLabel = new Label(description);
        descLabel.getStyleClass().add("feature-desc");
        
        card.getChildren().addAll(iconLabel, titleLabel, descLabel);
        return card;
    }
}
